﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceModel;
using System.ServiceModel.Channels;

namespace SimpleClient
{
    [ServiceContract]
    public interface IChat
    {
        [OperationContract]
        string ReverseString(string str);

        [OperationContract]
        bool Join(string nickname);

        [OperationContract]
        void Disconnect(string nickname);

        [OperationContract]
        void ReceiveMessage(string nickname, string message);

        [OperationContract]
        Tuple<int, List<Tuple<string, string>>> GetNewMessages(string nickname, int idLastMessage);

        [OperationContract]
        List<string> Users();
    }

    class Program
    {
        static void Main(string[] args)
        {
            var httpFactory = new ChannelFactory<IChat>(
                new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/Chat"));


            var httpProxy = httpFactory.CreateChannel();

            var nick = "";
            while (true)
            {
                Console.WriteLine("Введите желаемый ник: ");
                nick = Console.ReadLine();
                if (httpProxy.Join(nick) == true)
                {
                    Console.WriteLine("Вы зарегистрированы в чате под ником: {0}", nick);
                    Console.WriteLine("Для получения списка команд введите help");
                    break;
                }
                Console.WriteLine("Извините, но выбранный ник не подходит, попробуйте другой");
            }

            var tmp = httpProxy.GetNewMessages(nick, -1);
            var last = tmp.Item1;

            while (true)
            {
                var command = Console.ReadLine();

                switch (command)
                {
                    case "exit":
                        goto END;

                    case "list":
                        var lst = httpProxy.Users();
                        foreach (var user in lst) Console.WriteLine(user);
                        break;

                    case "message":
                        var msg = Console.ReadLine();
                        httpProxy.ReceiveMessage(nick,msg);
                        break;

                    case "new":
                        var msgs = httpProxy.GetNewMessages(nick, last);
                        last = msgs.Item1;

                        foreach (var message in msgs.Item2)
                        {
                            Console.WriteLine("Отправил: {0}", message.Item1);
                            Console.WriteLine(message.Item2);
                        }
                        break;

                    default:
                        Console.WriteLine("Неверная команда, введите help для получения списка команд.");
                        break;
                }
            }
END:

            httpProxy.Disconnect(nick);
            Console.WriteLine("Нажмите ENTER для выхода");
            Console.ReadLine();
        }
    }
}
